package role

import (
	"strings"

	"system-admin/config/mysql"
	"system-admin/internal/models"

	"192.168.1.75/go-pkg/errorx"
	"192.168.1.75/go-pkg/helper"
	"gorm.io/gorm"
)

// RoleList 角色列表
func RoleList(loginUserID string, page, limit int) (interface{}, int64) {
	var roles []models.Role
	db := mysql.NewDB()

	// 获取当前登录用户的信息
	var loginUser models.User
	db.Model(&models.User{}).Where("id = ?", loginUserID).Take(&loginUser)

	// 公共条件
	tx := db.Model(&models.Role{}).
		Where("merchant_id = ?", loginUser.MerchantID).
		Session(&gorm.Session{})

	// 角色数量
	var count int64
	tx.Count(&count)

	// 角色列表
	helper.Gorm{}.Paginate(tx, page, limit).
		Select(
			"id",
			"name",
			"created_at",
			"updated_at",
		).
		Find(&roles)

	// 返回结果
	return roles, count
}

// AddRole 新增角色
func AddRole(loginUserID string, roleName string) (string, error) {
	db := mysql.NewDB()

	// 获取登录用户的信息
	var loginUser models.User
	db.Model(&models.User{}).Where("id = ?", loginUserID).Take(&loginUser)

	// 参数检查
	if strings.TrimSpace(roleName) == "" {
		return "", errorx.New("角色名称不能为空", -1)
	}

	// 判断角色名是否存在
	{
		var count int64
		db.Model(&models.Role{}).
			Where(&models.Role{
				Name:       roleName,
				MerchantID: loginUser.MerchantID,
			}).
			Count(&count)
		if count > 0 {
			return "", errorx.New("角色名已存在", -1)
		}
	}

	// 新增
	var role models.Role
	role.Name = roleName
	role.MerchantID = loginUser.MerchantID
	rowsAffected := db.Model(&models.Role{}).Create(&role).RowsAffected
	if rowsAffected <= 0 {
		return "", errorx.New("新增角色失败", -1)
	}

	return role.ID, nil
}

// EditRole 编辑角色
func EditRole(loginUserID string, roleID string, roleName string) error {
	db := mysql.NewDB()

	// 基础权限检查
	if err := baseAuthCheck(loginUserID, roleID); err != nil {
		return err
	}

	// 获取登录用户的信息
	var loginUser models.User
	db.Model(&models.User{}).Where("id = ?", loginUserID).Take(&loginUser)

	// 检查角色名是否已经存在
	{
		var role models.Role
		if roleName != "" {
			rowsAffected := db.Model(&models.Role{}).
				Where(&models.Role{
					Name:       roleName,
					MerchantID: loginUser.MerchantID,
				}).Take(&role).
				RowsAffected
			if rowsAffected > 0 && role.ID != roleID {
				return errorx.New("角色名已存在", -1)
			}
		}
	}

	// 编辑角色
	rowsAffected := db.Model(&models.Role{}).Where("id = ?", roleID).Update("name", roleName).RowsAffected
	if rowsAffected <= 0 {
		return errorx.New("角色编辑失败", -1)
	}

	return nil
}

// DeleteRole 删除角色
// 正在被使用的角色不能删除
func DeleteRole(loginUserID string, roleID string) error {
	db := mysql.NewDB()
	// 编辑权限检查
	if err := baseAuthCheck(loginUserID, roleID); err != nil {
		return err
	}
	// 角色被使用，不能删除
	{
		var count int64
		db.Model(&models.User{}).Where("role_id = ?", roleID).Count(&count)
		if count > 0 {
			return errorx.New("正在使用中的角色，不能删除！", -1)
		}
	}

	// 删除角色
	rowsAffected := db.Model(&models.Role{}).Where("id = ?", roleID).Delete(&models.Role{}).RowsAffected
	if rowsAffected <= 0 {
		return errorx.New("角色删除失败", -1)
	}

	return nil
}

// baseAuthCheck 基础权限检查
func baseAuthCheck(loginUserID string, roleID string) error {
	db := mysql.NewDB()
	// 是否具有编辑权限
	{
		// 获取登录用户的信息
		var loginUser models.User
		db.Model(&models.User{}).Where("id = ?", loginUserID).Take(&loginUser)
		// 要编辑的用户的信息
		var editedRole models.Role
		rowsAffected := db.Model(&models.Role{}).Where("id = ?", roleID).Take(&editedRole).RowsAffected
		if rowsAffected <= 0 {
			return errorx.New("角色不存在", -1)
		}
		// 超级管理员可以跨企业管理
		if loginUser.IsSuperAdmin == 1 {
			return nil
		}
		if loginUser.IsSuperAdmin != 1 && loginUser.MerchantID != editedRole.MerchantID {
			return errorx.New("只能编辑同个企业的用户", -1)
		}
	}
	return nil
}
